﻿using System.Text;
using T.FAS.Runtime.DataAccess.Common;
using T.FAS.Runtime.DataAccess.Engine.ValidateChecker.Entity;

namespace T.FAS.Runtime.DataAccess.Engine
{
    public class StringValidateFactory : CommonFactory
    {
        public override IColumnValidater GetLengthValidater()
        {
            return new StringLengthValidater();
        }
        public override IColumnValidater GetNullValidater()
        {
            return new StringNullValidater();
        }
    }

    /// <summary>
    /// 通用非空校验Checker
    /// </summary>
    public class StringNullValidater : IColumnNullValidater
    {
        public ValidateCheckItem Validate(ValidateCheckItem item)
        {
            if (item.Result.IsStop)
                return item;
            //为空验证
            if (item.InputValue == null || string.IsNullOrEmpty(item.InputValue.ToString()))
            {
                if (item.CheckElement.IsAllowNull)
                    item.Result.IsStop = true;  //如果允许为空且输入值为空，停止后续校验
                //如果存在默认值，则通过非空校验，继续后面的校验流
                //todo:是否需要在此进行后端默认值赋值
                else if (!string.IsNullOrEmpty(item.CheckElement.DefaultValue))
                    ;
                else
                {
                    item.Result.Flag = false;
                    item.Result.IsStop = true;
                    item.Result.Msg.Append(string.Format(ValidateConst.NullErrorTemp,
                        item.CheckElement.Name,
                        item.CheckElement.DataType));
                }
            }
            return item;
        }
    }

    public class StringLengthValidater : IColumnLengthValidater
    {
        public ValidateCheckItem Validate(ValidateCheckItem item)
        {
            if (item.Result.IsStop)
                return item;
            //长度验证，如果String长度为0则默认不校验长度。
            var inputVal = item.InputValue.ToString();
            if (item.CheckElement.Length != 0)
            {
                bool isI18NVal = false;
                string i18NCode = string.Empty;
                if (item.ExtInfo != null && item.ExtInfo.ContainsKey(DACConst.CDO.IsI18NVal))
                {
                    if (item.ExtInfo[DACConst.CDO.IsI18NVal] is bool boolVal && boolVal == true)
                    {
                        isI18NVal = true;
                        i18NCode = item.ExtInfo[DACConst.I18NCode]?.ToString();
                    }
                }
                if (item.CheckElement != null && item.CheckElement.ElementExtInfo.ContainsKey("ValidByteLength"))
                {
                    var flag = (bool)item.CheckElement.ElementExtInfo["ValidByteLength"];
                    //按照字节判断输入值大小
                    if (flag)
                    {
#if NETSTANDARD2_1
                        //netcore程序需要先注册
                        Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
#endif
                        var byteCount = Encoding.GetEncoding(item.CheckElement.ElementExtInfo["Charset"].ToString()).GetByteCount(inputVal);
                        if (byteCount > item.CheckElement.Length)
                        {
                            item.Result.Flag = false;
                            if (isI18NVal && !string.IsNullOrEmpty(i18NCode))
                            {
                                item.Result.Msg.Append(
                                string.Format("国际化字段:{0},I18N:{5}类型:{1},输入值:{2},字节长度:{3},大于字段字节长度{4}" + ExceptionManage.LineFeedSymbol,
                                item.CheckElement.Name,
                                item.CheckElement.DataType,
                                inputVal,
                                byteCount,
                                item.CheckElement.Length,
                                i18NCode));
                            }
                            else
                            {
                                item.Result.Msg.Append(
                                string.Format("字段:{0},类型:{1},输入值:{2},字节长度:{3},大于字段字节长度{4}" + ExceptionManage.LineFeedSymbol,
                                item.CheckElement.Name,
                                item.CheckElement.DataType,
                                inputVal,
                                byteCount,
                                item.CheckElement.Length));
                            }
                            return item;
                        }
                    }
                }
                if (inputVal.Length > item.CheckElement.Length)
                {
                    item.Result.Flag = false;
                    item.Result.Msg.Append(string.Format(ValidateConst.LengthErrorTemp,
                        item.CheckElement.Name,
                        item.CheckElement.DataType,
                        inputVal,
                        inputVal.Length,
                        item.CheckElement.Length));
                }
            }
            return item;
        }
    }
}
